//*************** 中断执行  *****************/

async function f() {
    await Promise.reject('出错了')
    console.log('不会执行我')
    await Promise.resolve('hello world') // 不会执行
}
f()


//*************** 捕获错误  *****************/

async function f() {
    try {
        var rs = await Promise.reject('出错了')
    } catch (err) {
        console.log(err)
    }
}


//*************** 并发请求多个Promise  *****************/

// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()])


//*************** 同步执行  *****************/

async function dbFuc(db) {
    let docs = [{}, {}, {}]

    for (let doc of docs) {
        await db.post(doc)
    }
}


//*************** async 函数的实现原理  *****************/


async function fn(args) {
    // ...
}

// 等同于

function fn(args) {
    return spawn(function* () {
        // ...
    });
}

function spawn(genF) {
    return new Promise(function (resolve, reject) {
        const gen = genF();
        function step(nextF) {
            let next;
            try {
                next = nextF();
            } catch (e) {
                return reject(e);
            }
            if (next.done) {
                return resolve(next.value);
            }
            Promise.resolve(next.value).then(function (v) {
                step(function () { return gen.next(v); });
            }, function (e) {
                step(function () { return gen.throw(e); });
            });
        }
        step(function () { return gen.next(undefined); });
    });
}